//模拟实现系统调用产生信号

#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<cstdlib>
#include<string.h>
#include<cassert>
#include<errno.h>

void Usage(std::string proc)
//使用手册，当输入参数数量不对时展示
{
    std::cout<<"\tUsage: \n\t";
    std::cout<<proc<<"信号编号 目标进程\n"<<std::endl;
}

void mykill(int argc,char* argv[])
{
    if(argc !=3)//3是程序本身+两个命令参数
    {
        Usage(argv[0]);
        exit(1);
    }
    int signo=atoi(argv[1]);//目标信号
    int target_id=atoi(argv[2]);//目标进程

    int n=kill(target_id,signo);
    if(n!=0)
    {
        std::cout<<errno<<":"<<strerror(errno)<<std::endl;
        exit(2);
    }
}

void myhandler(int signo)
{
    std::cout<<"get a signal:"<<signo<<std::endl;
}

void myraise(int sig)
{

    std::cout<<"raise展示"<<std::endl;
    signal(SIGINT,myhandler);
    sleep(1);
    raise(sig);
}


void myalarm()
{
    alarm(1);
    int count=0;
    while(true)
    {
        std::cout<<"count:"<<count++<<std::endl;
        //可以用于计算1s内计算机会将整数累加到多少
        //能模拟算力，但这并不准确。因为打印IO、ssh的网络影响时间
    }
}

void mysystem()//硬件异常
{
    signal(SIGFPE, myhandler);
    int a = 10;
    a /= 0;
    std::cout << "div zero ... here" << std::endl;
    //除0异常崩溃
}

//./mykill 9 1234
int main(int argc,char* argv[])
{
    //mykill(argc,argv);
    //myraise(2);//对自己使用2号信号
    //myalarm();
    mysystem();
    return 0;
}